// TypeScript 也有一个特殊的类型，any，当你不希望某个特定的值导致类型检查错误时，你可以使用它。

// 设置成any类型的变量就不会参与类型检查，使用ts就是为了给变量加入静态类型检查，如果动不动就设置any，那使用ts就没什么意义


let obj: any = { x: 0 };
// None of the following lines of code will throw compiler errors.
// Using `any` disables all further type checking, and it is assumed 
// you know the environment better than TypeScript.
obj.foo();
obj();
obj.bar = 100;
obj = "hello";  
const n: number = obj;   //这几行代码都是对any类型的变量进行操作，尽管类型上是不对的，但是并不会报错，对any类型的变量的后续操作ts都不会校验，包括重新赋值，访问属性，方法调用，赋值给其他类型的变量

//

// n()  
//此时的n如果没直接给类型，那就是类型推断，跟obj是一个类型，但是这里在声明n的时候给了n一个number类型，n就是number类型，赋值可以给n数字或者any类型,但是n还是number类型，所以把n当方法调用就会被ts检测出错误，

// 当您不想写出一个长类型只是为了让 TypeScript 相信特定的代码行是可以的时，该类型很有用。

// 当一个变量的值需要很复杂的类型代码去定义的时候，你又不想写这个类型，你认为这个变量的值肯定不会出问题，就可以用到any,把这个变量的操作从类型校验中排除

// noImplicitAny
// 当你没有指定类型，并且 TypeScript 不能从上下文推断它时，编译器通常会默认为any.

// 但是，您通常希望避免这种情况，因为any没有进行类型检查。使用编译器标志noImplicitAny将任何隐式标记any为错误。

// 在没给变量设置类型，且没给变量赋值的时候，那ts就回给变量设置成any类型，这个变量的后续操作就不会被ts校验，在noImplicitAny不允许隐式any设置打开的时候，就会报错，
// const  m
// function z(a){
//     console.log(a);
    
// }
// 以上两个例子都有隐式any,在声明函数的时候，如果有设置形参，那么一定要给形参设置类型，否则ts肯定会认为函数的形参是any，不允许隐式any时直接报错,即使允许了隐式any，不报错，但是这个形参也不会参与类型校验，ts对它不会起作用,这也不是我的期望，所以不管咋样，定义形参一定要添加类型

